package com.pe.pgn.clubpgn.dao.impl;


import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.BonoManualConsultaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpmBonoClientePersona;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Repository("BonoManualConsultaDao")
public class BonoManualConsultaDaoImpl extends GenericDaoHibernate<ClpmBonoClientePersona, Long> implements BonoManualConsultaDao {
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}


	public BonoManualConsultaDaoImpl() {
		super(ClpmBonoClientePersona.class);
	}

	@SuppressWarnings("unchecked")
	public List<ClpmBonoClientePersona> ConsultarBonosManuales(
			ClpmBonoClientePersona consulbonomanual) {
		
		
		StringBuffer query = new StringBuffer(); 
		query.append(" select bcp.id,");
		query.append(" (per.de_nombre"+ "|| ' ' ||" +" per.de_ape_paterno "+"|| ' ' ||" +" per.de_ape_materno) as deClientePersona,");
		query.append(" to_char(bcp.da_fecha_vencimiento,'"+CLPConstantes.DATE_PATTERN+"') as fechaVencimiento,");
		query.append(" to_char(bcp.da_fecha_generacion,'"+CLPConstantes.DATE_PATTERN+"') as fechaGeneracion,");
		query.append(" to_char(ven.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"') as fechaConsumo,");
		query.append(" bcp.st_tipo_generacion as strTipoGeneracion,");
		query.append(" tb.de_tipo_bono as deTipoBono, ");
		query.append(" bcp.st_bono_cliente_persona as strBonoClientePersona ");
		query.append(" from clpm_bono_cliente_persona bcp");
		query.append(" join clpd_tipo_bono tb on tb.id= bcp.co_tipo_bono");
		query.append(" join clpb_cliente_persona per on per.id = bcp.co_cliente_persona");
		query.append(" left join clpm_venta ven on ven.id = bcp.co_venta_consumo");
		query.append(" where 1 = 1 ");

			if(StringUtils.isNotBlank(consulbonomanual.getIniFechaVencimiento())){
				query.append(" and  to_date(to_char(bcp.da_fecha_vencimiento, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >to_date('").append(consulbonomanual.getIniFechaVencimiento()).append("', '"+CLPConstantes.DATE_PATTERN+"')");
			}
			if(StringUtils.isNotBlank(consulbonomanual.getFinFechaVencimiento())){
				query.append("  and   to_date(to_char(bcp.da_fecha_vencimiento, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date('").append(consulbonomanual.getFinFechaVencimiento()).append("', '"+CLPConstantes.DATE_PATTERN+"')");
			}
			
			if(StringUtils.isNotBlank(consulbonomanual.getDeClientePersona())){
				query.append(" and upper(per.de_nombre"+ "|| ' ' ||" +" per.de_ape_paterno "+"|| ' ' ||" +" per.de_ape_materno) like upper('%"+consulbonomanual.getDeClientePersona()+"%')");
			}
			if(StringUtils.isNotBlank(consulbonomanual.getStrTipoGeneracion())&& !consulbonomanual.getStrTipoGeneracion().equals("-1")){
				query.append(" and bcp.st_tipo_generacion = '").append(consulbonomanual.getStrTipoGeneracion()).append("'");		
			}

			if(StringUtils.isNotBlank(consulbonomanual.getCoTipoBono()) && !consulbonomanual.getCoTipoBono().toString().equals("-1")){
				query.append(" and bcp.co_tipo_bono = ").append(consulbonomanual.getCoTipoBono());
			}
			
			if(StringUtils.isNotBlank(consulbonomanual.getStrUsado()) && !consulbonomanual.getStrUsado().equals("-1")){
				query.append(" and  bcp.st_usado  = '").append(consulbonomanual.getStrUsado()).append("'");		
			}
			
			if(StringUtils.isNotBlank(consulbonomanual.getStrBonoClientePersona()) && !consulbonomanual.getStrBonoClientePersona().equals("-1")){
				query.append(" and bcp.st_bono_cliente_persona = '").append(consulbonomanual.getStrBonoClientePersona()).append("'");
			}
		
			
			
		return findListOfBeans(query.toString(), null, ClpmBonoClientePersona.class);
		
		
	}


	@SuppressWarnings("unchecked")
	public List<ClpmBonoClientePersona> consultarTodo() {
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	bcp.id, ");
		query.append(" 	trim(cp.de_nombre)||' '|| trim(cp.de_ape_paterno)||' '||trim(cp.de_ape_materno) as deClientePersona, ");
		query.append(" 	to_char(bcp.da_fecha_vencimiento, '"+CLPConstantes.DATE_PATTERN+"') as fechaVencimiento, ");
		query.append(" 	to_char(bcp.da_fecha_generacion, '"+CLPConstantes.DATE_PATTERN+"') as fechaGeneracion, ");
		query.append(" 	to_char(ventaconsumo.da_fecha_venta, '"+CLPConstantes.DATE_PATTERN+"') as fechaConsumo, ");
		query.append(" 	bcp.st_tipo_generacion as strTipoGeneracion, ");
		query.append(" 	tb.de_tipo_bono as deTipoBono, ");
		query.append(" 	bcp.st_bono_cliente_persona as strBonoClientePersona ");
		
		query.append(" from clpm_bono_cliente_persona bcp ");
		query.append(" join clpd_tipo_bono tb on tb.id = bcp.co_tipo_bono ");
		query.append(" join clpb_cliente_persona cp on cp.id = bcp.co_cliente_persona ");
		query.append(" left join clpm_venta ventaconsumo on ventaconsumo.id = bcp.co_venta_consumo ");
		
		query.append(" where bcp.st_bono_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
	
		
		return findListOfBeans(query.toString(), null, ClpmBonoClientePersona.class);
		
		}

	
	public ClpmBonoClientePersona obtenerBonoManual(Long id) {

		ClpmBonoClientePersona bean = new ClpmBonoClientePersona();		
		StringBuffer query = new StringBuffer();
		
		query.append("  select ");
		query.append(" 	bcp.id, ");
		query.append(" 	bcp.co_cliente_persona as coClientePersona, ");
		query.append(" 	trim(cp.de_nombre)||' '|| trim(cp.de_ape_paterno)||' '||trim(cp.de_ape_materno) as deClientePersona, ");
		query.append(" 	to_char(bcp.da_fecha_vencimiento, '"+CLPConstantes.DATE_PATTERN+"') as fechaVencimiento, ");
		query.append(" 	to_char(bcp.da_fecha_generacion, '"+CLPConstantes.DATE_PATTERN+"') as fechaGeneracion, ");
		query.append(" 	prom.id as coPromocionBono, ");
		query.append(" 	prom.de_nombre as dePromocionBono, ");
		query.append(" 	bcp.co_tipo_bono as coTipoBono, ");
		query.append(" 	tb.de_tipo_bono as deTipoBono, ");		
		query.append(" 	bcp.va_cantidad as vaCantidad, ");
		query.append(" 	bcp.co_venta_consumo as coVentaConsumo, ");
		query.append(" 	bcp.co_venta_generacion as coVentaGeneracion, ");
		query.append(" 	trim(ventageneracion.co_serie)||' - '|| trim(ventageneracion.co_recibo)||' - '||trim(ventageneracion.co_code_estacion) as deVentaGeneracion, ");
		query.append(" 	trim(ventaconsumo.co_serie)||' - '|| trim(ventaconsumo.co_recibo)||' - '||trim(ventaconsumo.co_code_estacion) as deVentaConsumo, ");		
		query.append(" 	bcp.st_bono_cliente_persona as strBonoClientePersona, ");
		query.append(" 	bcp.st_tipo_generacion as strTipoGeneracion, ");
		query.append(" 	bcp.st_usado as strUsado ");
		
		query.append(" from clpm_bono_cliente_persona bcp ");
		query.append(" join clpd_tipo_bono tb on tb.id = bcp.co_tipo_bono ");
		query.append(" join clpb_promocion_bono prom on prom.co_tipo_bono = bcp.co_tipo_bono ");
		query.append(" join clpb_cliente_persona cp on cp.id = bcp.co_cliente_persona ");
		query.append(" left join clpm_venta ventaconsumo on ventaconsumo.id = bcp.co_venta_consumo ");
		query.append(" left join clpm_venta ventageneracion on ventageneracion.id = bcp.co_venta_generacion ");
		
		query.append(" where bcp.id = ").append(id);
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		
		if(ValidationUtil.validateList(list)){
			
			Map<String, Object> map  = (HashMap<String, Object>)list.get(0);
			String coVentaConsumo 	 = String.valueOf(map.get("coVentaConsumo"));
			String deVentaConsumo 	 = String.valueOf(map.get("deVentaConsumo"));
			String coVentaGeneracion = String.valueOf(map.get("coVentaGeneracion"));
			String deVentaGeneracion = String.valueOf(map.get("deVentaGeneracion"));
			String fechaGeneracion 	 = String.valueOf(map.get("fechaGeneracion"));
			String fechaVencimiento  = String.valueOf(map.get("fechaVencimiento"));
			String strTipoGeneracion = String.valueOf(map.get("strTipoGeneracion"));
			String strUsado 		 = String.valueOf(map.get("strUsado"));
			String strBonoCliente	 = String.valueOf(map.get("strBonoClientePersona"));
			
			bean.setId(id);
			bean.setCoClientePersona(map.get("coClientePersona").toString());
			bean.setDeClientePersona(map.get("deClientePersona").toString());
			bean.setCoPromocionBono(map.get("coPromocionBono").toString());
			bean.setDePromocionBono(map.get("dePromocionBono").toString());
			bean.setVaCantidad(new Long(map.get("vaCantidad").toString()));
			bean.setCoTipoBono(map.get("coTipoBono").toString());
			bean.setDeTipoBono(map.get("deTipoBono").toString());			
			
			if(!fechaGeneracion.equals("null") && !fechaGeneracion.equals("")){
				bean.setFechaGeneracion(fechaGeneracion);
			}
			
			if(!fechaVencimiento.equals("null") && !fechaVencimiento.equals("")){
				bean.setFechaVencimiento(fechaVencimiento);
			}
			
			if(!coVentaGeneracion.equals("null") && !coVentaGeneracion.equals("")){
				bean.setCoVentaGeneracion(coVentaGeneracion);
				bean.setDeVentaGeneracion(deVentaGeneracion);
			}
			
			if(!coVentaConsumo.equals("null") && !coVentaConsumo.equals("")){
				bean.setCoVentaConsumo(coVentaConsumo);
				bean.setDeVentaConsumo(deVentaConsumo);
			}
			
			bean.setStTipoGeneracion(strTipoGeneracion);
			if(strTipoGeneracion.equals(CLPConstantes.WEBSERVICE)){
				bean.setDeTipoGeneracion(CLPConstantes.DE_REGULAR);
			}else if(strTipoGeneracion.equals(CLPConstantes.MANUAL)){
				bean.setDeTipoGeneracion(CLPConstantes.DE_MANUAL);
			}
			
			if(strUsado.equals(CLPConstantes.ST_VERDADERO)){
				bean.setStUsado(true);
			}else{
				bean.setStUsado(false);	
			}
			
			if(strBonoCliente.equals(CLPConstantes.ST_VERDADERO)){
				bean.setStBonoClientePersona(true);
			}else{
				bean.setStBonoClientePersona(false);
			}			
		}
		
		return bean;
	}
}
